<?php
/**
 * Handler fuer MVC-Konstrukte
 *
 * @author		Joachim Ruf
 * @copyright	Copyright (c) 2003-2010 Loresoft Software (http://www.loresoft.de)
 * @license		http://yapary.loresoft.de/lizenzbedingungen     New BSD License
 *
 * */


Class Yapary_MVC_MVC
{
	/** @var array $arrException : Speicherung aller Exceptions */
	private $arrException = array();

	/** @var string $pathClass : Pfad oder nur Klassenname der in der MVC-Verzeichnisstruktur vorhandenen Klassen */
	private $pathClass = NULL;

	/** @var string $mvcToLoad : Klassenname ohne die Endung Model|View|Controller */
	private $mvcToLoad = NULL;

	/** @var : das vom Handler geladene Model/View/Controller */
	private $loadedModelName      = NULL;
	private $loadedViewName       = NULL;
	private $loadedControllerName = NULL;

	/* @var Als zentraler Dump fuer Model View und Controller gedacht,
	 * in welchem alle benoetigten Objekte liegen#
	 * */
	private $oExchange  = NULL;
	/** @var object $oMVCGum	: Klasse zur Verbindung eines MVC-Konstrukts */
	private $oMVCGum    = NULL;
    /** @object $oMVCConfig		: MVC-Konfigurationsklasse */
    private $oMVCConfig = NULL;
	/** @var Gibt an ob das MVC-Modell erfolgreich geladen wurde. {true|false|NULL} */
	private $valid      = NULL;
    /** @var Speicherung des auszugebenden Inhalts nach aufruf des entspr. Views */
    private $content    = '';


    /**
	* Pfadangaben zu den einzlenen Verzeichnissen in denen Model, View und Contrl-Dateien liegen
	* @param array $arr			: Konfiguration der Pfadangaben {model|view|controller|partial|css|js|fileFormat}
	*/
	function __construct(Yapary_MVC_MVCConfig $_cMVCConfig)
	{
	    Yapary_TraceRoute::add();

	    if ($_cMVCConfig->modelPath === NULL) {
            trigger_error('Yapary_MVC_MVCConfig::$modelPath nicht definiert', E_USER_ERROR);
        } elseif (!is_dir($_cMVCConfig->modelPath)) {
            trigger_error('Verzeichnis zum Model: ' . $_cMVCConfig->modelPath . ' existiert nicht', E_USER_ERROR);
		}

		if ($_cMVCConfig->viewPath === NULL) {
		    trigger_error('Yapary_MVC_MVCConfig::$viewPath nicht definiert', E_USER_ERROR);
        } elseif (!is_dir($_cMVCConfig->viewPath)) {
		    trigger_error('Verzeichnis zum View: ' . $_cMVCConfig->viewPath . ' existiert nicht', E_USER_ERROR);
		}

		if ($_cMVCConfig->controllerPath === NULL) {
		    trigger_error('Yapary_MVC_MVCConfig::$controllerPath nicht definiert', E_USER_ERROR);
        } elseif (!is_dir($_cMVCConfig->controllerPath)) {
		    trigger_error('Verzeichnis zum Controller: ' . $_cMVCConfig->controllerPath . ' existiert nicht', E_USER_ERROR);
		}

		if ($_cMVCConfig->partialPath === NULL) {
		    trigger_error('Yapary_MVC_MVCConfig::$partialPath nicht definiert', E_USER_ERROR);
        } elseif (!is_dir($_cMVCConfig->partialPath)) {
		    trigger_error('Verzeichnis zum Partial: ' . $_cMVCConfig->partialPath . ' existiert nicht', E_USER_ERROR);
		}

		$classMVCGum  = 'Yapary_MVC_MVCGum';
		if ($_cMVCConfig->enableFileCheck === true) {
    		if (!class_exists($classMVCGum)) {
    			throw new Exception('<pre>Klasse ' . $classMVCGum . ' existiert nicht</pre>');
    			return false;
    		}
		}
		$classExchange = 'Yapary_MVC_Exchange';
		if ($_cMVCConfig->enableFileCheck === true) {
    		if (!class_exists($classExchange)) {
    			throw new Exception('<pre>Klasse ' . $classExchange . ' existiert nicht</pre>');
    			return false;
    		}
		}

		$this->oExchange  = new $classExchange();
		$this->oMVCGum    = new $classMVCGum($_cMVCConfig, $this->oExchange);
		$this->oMVCConfig = $_cMVCConfig;
	}


	/**
	 * Leitet den Zugriff auf alle vorhandenen Methoden weiter
	 * Wichtig: nur bei Methoden ohne Parameterweitergabe moeglich
	 * {model()|view()|exchange()}
	 * return Object|NULL
	 * */
	public function __get($objName)
	{
//	    Yapary_TraceRoute::add();

	    if (method_exists($this, $objName)) {
	        return $this->$objName();
	    }

	    return NULL;
	}


	/**
	 * Ausgabe des erstellen Inhalts
	 * @return string
	 * */
	public function run()
	{
	    Yapary_TraceRoute::add();

// Steht nun in MVCGum
//	    if ($this->oMVCConfig->enableEncoding === true) {
//            mb_internal_encoding($this->oMVCConfig->internalEncoding);
//            //mb_http_input($this->oMVCConfig->outputEncoding);
//            mb_http_output($this->oMVCConfig->outputEncoding);
//            ob_start('mb_output_handler');
//	    } else{
//            ob_start();
//	    }

	    $this->oMVCGum->run();
		$this->content = ob_get_contents();
		ob_end_clean();
	}


	/**
	 * Liefert den vom MVC-Model erzeugten Content
	 * @return string
	 * */
	public function getContent()
	{
	    Yapary_TraceRoute::add();

	    return $this->content;
	}


	/**
	* Laedt Controller und Action
	* @param string $_mvcToLoad    : Name/Pfadname des zu ladenden MVC-Models im Format: dir1_dir2_classname.php5
	* @param string $_actionname   : Name der vom Controller auszufuehrende Action
	* @param array $_arrActionVars : an die Action uz uebergebende Variablen
	* @return bool
	*
	*/
	public function loadMVC ($_controllerName, $_actionName, $_viewName, array $_arrActionVars = array())
	{
	    Yapary_TraceRoute::add();

	    return $this->valid = $this->oMVCGum->load($_controllerName, $_actionName, $_viewName, $_arrActionVars);
	}


	/**
	* Laedt den Default-Controller und Default-Action falls das erste Lade mit laodMVC() schief laeuft
	* @param string $_controllerName    : Name/Pfadname des zu ladenden MVC-Models im Format: dir1_dir2_classname.php5
	* @param string $_actionname   : Name der vom Controller auszufuehrende Action
	* @param array $_arrActionVars : an die Action uz uebergebende Variablen
	* @return bool
	*/
	public function loadMVCOnFailure ($_controller, $_actionName, $_viewName, array $_arrActionVars = array())
	{
	    Yapary_TraceRoute::add();

	    if ($this->valid === NULL) {
	        throw new Exception('<pre>loadMVCOnFailure() muss nach loadMVC() aufgerufen werden</pre>');
	    }

	    if ($this->valid === false) {
	        if ($this->loadMVC($_controller, $_actionName, $_viewName, $_arrActionVars) === true) { // Nachladen erfolgreich
	            $this->oMVCConfig->error = (int) 404;
	            return true;
	        } else { // Auch Nachladen ging schief
	            trigger_error('MVCLoader: Unable to load MVC! This error occurs, because it was not possible to load the error page. Please check MVC exception list', E_USER_WARNING);
	        }
	    }

	    return false;
	}


	/**
	 * Liefert das Model alsReferenz zurueck
	 * @return Yapary_MVC_Model
	 * */
	public function model ()
	{
	    if ($this->oMVCGum->cModel === NULL) {
			$this->arrException[] = new Exception('Model existiert nicht');
			return NULL;
		}

		return $this->oMVCGum->cModel;
	}


	/**
	 * Liefert den View alsReferenz zurueck
	 * @return Yapary_MVC_View
	 * */
	public function view ()
	{
	    if ($this->oMVCGum->cView === NULL) {
			$this->arrException[] =  new Exception('View existiert nicht');
			return NULL;
		}

		return $this->oMVCGum->cView;
	}


	/**
	 * Liefert den Controller alsReferenz zurueck
	 * @return Yapary_MVC_Controller
	 * */
	public function controller ()
	{
	    if ($this->oMVCGum->cController === NULL) {
			$this->arrException[] = new Exception('Controller existiert nicht');
			return NULL;
		}

		return $this->oMVCGum->cController;
	}


	/**
	 * Liefert die globalen Variablen/Objekte zurueck
	 * @return Yapary_MVC_Exchange
	 * */
	public function exchange ()
	{
	    if ($this->oExchange === NULL) {
			$this->arrException[] = new Exception('MVCData existiert nicht');
			return NULL;
		}

		return $this->oExchange;
	}


	/**
	* Liefert alle ausgeloesten Exceptions
	* @return Array[Exception]
	*/
	public function getExceptionList ()
	{
        return $this->oMVCGum->getExceptionList();
	}


	/**
	* Liefert die Anzahl der vorhandenen Exceptions
	* @return int
	*/
	public function getExceptionCount ()
	{
		return $this->oMVCGum->getExceptionCount();
	}

}


?>